Throughout software development, application components are collected and compiled for testing and debugging purposes. The compilation of all the components of the software product into a version of the program is called a build. Typically, reiterative builds are required in the development process. Build engines, whether stand-alone or incorporated into a design environment, are typically black boxes into which source code is fed and binaries or assemblies are emitted. As programming becomes more sophisticated, the demand for programming tools has increased. This has led to incorporation of design tools and build engine into an integrated design environment. This practice presents new problems. For example, it can be difficult to map a complicated build infrastructure into an integrated design environment. Problems typically center around the inability to fully customize or understand what happens when a project is built within the development environment; the inability to reproduce a build within a build lab environment where the integrated design environment is not likely to be present; and the limitations of a build system that is optimized to model single projects rather than entire products.